<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>单例模式（Singleton Pattern）</title>
  <!-- 
  单例模式（Singleton Pattern）是一种常用的设计模式，它确保一个类只有一个实例，并提供一个全局访问点。单例模式在需要控制对某些资源的访问时非常有用，例如数据库连接、配置对象等。
  ### 单例模式的特点
  1. **唯一性**：单例模式确保一个类只有一个实例。
  2. **全局访问**：提供一个全局访问点来获取该实例。
  3. **延迟实例化**：单例模式可以实现延迟加载，即在第一次使用时才创建实例。

  ### 单例模式的实现
  在JavaScript中，可以通过多种方式实现单例模式。以下是几种常见的实现方式：

  #### 1. 使用闭包

  ```javascript
  const Singleton = (function() {
      let instance;

      function createInstance() {
          return new Object("I am the instance");
      }

      return {
          getInstance: function() {
              if (!instance) {
                  instance = createInstance();
              }
              return instance;
          }
      };
  })();

  // 使用示例
  const instance1 = Singleton.getInstance();
  const instance2 = Singleton.getInstance();

  console.log(instance1 === instance2); // true
  ```

  #### 2. 使用 ES6 类

  ```javascript
  class Singleton {
      constructor() {
          if (Singleton.instance) {
              return Singleton.instance;
          }
          Singleton.instance = this;
          // 初始化其他属性
      }

      // 其他方法
  }

  // 使用示例
  const instance1 = new Singleton();
  const instance2 = new Singleton();

  console.log(instance1 === instance2); // true
  ```

  ### 单例模式的优缺点

  #### 优点：

  - **节省资源**：避免了重复创建实例，节省了内存和资源。
  - **全局访问**：提供了全局的访问方式，便于管理和使用。

  #### 缺点：

  - **隐藏依赖**：使用单例可能会导致代码之间的隐式依赖，降低代码的可测试性。
  - **不易扩展**：单例模式可能会导致系统的可扩展性降低，因为它限制了类的实例化。

  ### 适用场景

  - 当一个类只需要一个实例时，例如配置管理、日志记录等。
  - 当需要控制对某些资源的访问时，例如数据库连接池。

  ### 总结

  单例模式是一种重要的设计模式，在许多应用场景中都有其独特的价值。理解并正确使用单例模式可以帮助开发者更好地管理资源和控制程序的状态。
  -->
</head>

<body>

  <script>
    // 单例模式是一种常用的设计模式，它确保一个类只有一个实例，并提供一个全局访问点来获取这个实例。

    // 创建一个单例对象的函数
    function createInstance() {
      // 在这里创建你的单例对象
      const instance = {
        // 单例对象的属性和方法
      };

      return instance;
    }

    // 创建一个单例对象
    const SingletonFn = (function () {
      let instance = null;

      return {
        getInstance: function () {
          if (!instance) {
            instance = createInstance();
          }
          return instance;
        },
      };
    })();

    // 使用示例
    const instanceFn1 = SingletonFn.getInstance();
    const instanceFn2 = SingletonFn.getInstance();

    console.log(instanceFn1 === instanceFn2); // true

    // 单例模式实现
    class Singleton {
      constructor() {
        if (Singleton.instance) {
          return Singleton.instance;
        }
        // 初始化其他属性和方法
        this.name = 'Singleton';
        Singleton.instance = this;
        return this;
      }
    }

    const instance1 = new Singleton();
    const instance2 = new Singleton();

    console.log(instance1 === instance2); // true
  </script>

</body>

</html>